
// 一、定义声明式类型的函数
// 语法： function 函数名(参数1:参数类型, 参数2:参数类型): 返回值类型 {函数体}
function test(name: string, age: number): number {
    return age
}
var res: number = test('张三', 18)


// 函数参数不确定--可选参数
// 语法： function 函数名(参数1:参数类型, 参数2?:参数类型): 返回值类型 {函数体}
function test2(name: string, sex?: string): string {
    return name
}
var res2: string = test2('李四', '男') // 这里第二个参数可传可不传


// 函数参数的默认值
// 语法： function 函数名(参数1:参数类型, 参数2:参数类型 = 默认值): 返回值类型 {函数体}
function test3(name: string, sex: string = '男'): string {
    return sex
}
var res3: string = test3('王五') // 这里第二个参数未传的话，默认值为'男'


//  二、定义表达式类型的函数
// 语法： var 变量名 = function (参数1:参数类型, 参数2:参数类型): 返回值类型 {函数体}
var test4 = function (name: string, age: number): number {
    return age
}
// 上面这种定义方式只是约束了函数，我们应该也来约束这个变量
// 方法1：
// 语法： var 变量名: (参数1:参数类型, 参数2:参数类型) => 返回值类型 = function (参数1:参数类型, 参数2:参数类型): 返回值类型 {函数体}
var test4: (name: string, age: number) => number = function (name: string, age: number): number {
    return age
}
// 方法2：使用接口方式
interface Fun {
    (name: string, age: number): number
}
var test4: Fun = function (name: string, age: number): number {
    return age
}

// 三、函数重载
function getValue(val: string | number): string | number {
    return val
}

// let value1: number = getValue(1) // 会报错
let value1: number | string = getValue(1) // 只能这样写


//  对于联合类型的函数，可以采用重载的方式
function getValue1(val: string): string // 代表：输入是string,输出也是string
function getValue1(val: number): number // 代表：输入是number,输出也是number
function getValue1(val: string | number): string | number {
    return val
}

let value2: number = getValue1(1)
let value3: string = getValue1('1')

